From 3eb22a1ff80272c6b8df37690262d2907069a9e1 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 9 Mar 2007 05:28:00 +0000 Subject: [PATCH] Defer the callbacks to an idle to avoid deadlock with xcb-ified libX11. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2007-03-08 Matthias Clasen * gdk/x11/gdkasync.c (send_event_handler): Defer the callbacks to an idle to avoid deadlock with xcb-ified libX11. (#413032, Sebastian Dröge) svn path=/trunk/; revision=17436 --- ChangeLog | 6 ++++++ gdk/x11/gdkasync.c | 16 +++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index ded01546c7..ff3409c3f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2007-03-08 Matthias Clasen + + * gdk/x11/gdkasync.c (send_event_handler): Defer the callbacks + to an idle to avoid deadlock with xcb-ified libX11. (#413032, + Sebastian Dröge) + 2007-03-08 Matthias Clasen * gtk/gtknotebook.c (gtk_notebook_real_insert_page): diff --git a/gdk/x11/gdkasync.c b/gdk/x11/gdkasync.c index e360bf1a15..6336660061 100644 --- a/gdk/x11/gdkasync.c +++ b/gdk/x11/gdkasync.c @@ -112,6 +112,18 @@ struct _SetInputFocusState gulong get_input_focus_req; }; +static gboolean +callback_idle (gpointer data) +{ + SendEventState *state = (SendEventState *)data; + + state->callback (state->window, !state->have_error, state->data); + + g_free (state); + + return FALSE; +} + static Bool send_event_handler (Display *dpy, xReply *rep, @@ -147,12 +159,10 @@ send_event_handler (Display *dpy, } if (state->callback) - state->callback (state->window, !state->have_error, state->data); + gdk_threads_add_idle (callback_idle, state); DeqAsyncHandler(state->dpy, &state->async); - g_free (state); - return (rep->generic.type != X_Error); } -- 2.30.2